package test;

import java.lang.reflect.Method;

public class AccessPersonMethods {
    public static void main(String[] args) {
        try {
//            Class<?> aClass = Class.forName("test.MyBatis");
            // 通过反射加载Person类
            Class clz = Class.forName("entity.Person");
            // 根据方法名和参数列表货区static final int getAge()方法
            // 没有参数可以不写或用null来表示
            Method getAge = clz.getDeclaredMethod("getAge", null);
            // getAge方法为defualt(package),这里已超出其他访问范围，不能直接访问
            // 通过setAccessble方法，设定为可以访问
            getAge.setAccessible(true);
            // 调用getAge 方法并传参，没有参数可以不写或用null表示
            // getAge方法为静态方法，调用时可以不指定具体Person实例
            Object returnAge = getAge.invoke(null, null);
            System.out.println(returnAge);

            // 创建Person实例
            Object person = clz.newInstance();
            // 根据方法名和参数列表获取private void silentMethod()方法
            // 没有参数可以不写或用null表示
            Method silenMethod = clz.getDeclaredMethod("silenMethod", null);
            // silenMethod方法为private 这里已超出去访问范围，不能直接访问
            // 通过 setAccessble方法，设定为可以访问
            silenMethod.setAccessible(true);
            //调用 silenMethod 方法并参数 没有参数可以不写或用null表示
            silenMethod.invoke(person, null);

            // 根据方法名和参数列表获取public void setName(String)方法
            Method setName = clz.getDeclaredMethod("setName", String.class);

            // setName方法为public 这里可以直接访问
            // 调用setName 方法并参数
            setName.invoke(person, "New Person");
            // 验证一下结果，泰永public String getName()方法得到name的值
            Object returnName = clz.getDeclaredMethod("getName").invoke(person);
            System.out.println("刚才设定的name是"+returnName);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
